import threading
from threading import Thread,Lock
import time

locka=Lock()
lockb=Lock()


class MyThread1(Thread):
    @classmethod
    def __init__(cls,name):
        """
         __init__方法初始化需要引入超类使其生效！！！
         不使用__init__方法的话会系统会自动为线程生成一个name
        """
        super().__init__(cls)
        cls.name=name
    """
    继承Thread
    """
    def run(self):          #重写run（）方法
        if locka.acquire():
            print(self.name+"获取了a锁\n")              # \n换行
            time.sleep(0.1)
            # if lockb.acquire():
                # if locka.acquire():
            if locka.acquire(timeout=4):
                # 要避免死锁，而不是写出死锁，所以可以通过acquire(timeout=n)来确定超时时间从而让进城释放锁
                # 1和2如果用相同的超时时间的话，最后进城都执行失败，所以在这里要定义不同的超时时间
                print(self.name + "获取了a锁且获取了b锁")
                time.sleep(0.1)
                lockb.release()
            locka.release()
class MyThread2(Thread):
    @classmethod
    def __init__(cls,name):
        """
         __init__方法初始化需要引入超类使其生效！！！
         不使用__init__方法的话会系统会自动为线程生成一个name
        """
        super().__init__(cls)
        cls.name=name
    """
    继承Thread
    """
    def run(self):          #重写run（）方法
        if lockb.acquire():
            print(self.name+"获取了b锁")
            time.sleep(0.1)
            # if locka.acquire():
            if locka.acquire(timeout=5):
                # 要避免死锁，而不是写出死锁，所以可以通过acquire(timeout=n)来确定超时时间从而让进城释放锁
                print(self.name + "获取了b锁且获取了a锁")
                time.sleep(0.1)
                locka.release()
            lockb.release()
if __name__=="__main__":
    t1=MyThread1("线程1")
    t2=MyThread2("线程2")
    t1.start()
    t2.start()
    """
    死锁、ab互相不释放资源且一直请求对方的资源
    """

